from django.shortcuts import render
from django.views import View
from django import http
from alipay import AliPay
from django.conf import settings
import os

from meiduo_mall.utils.views import LoginRequiredJSONMixin
from apps.orders.models import OrderInfo
from meiduo_mall.utils.response_code import RETCODE
from apps.payment.models import Payment
# Create your views here.


# 读取应用私钥和支付宝公钥内容
app_private_key_string = open(os.path.join(os.path.dirname(os.path.abspath(__file__)),"keys/app_private_key.pem")).read()
alipay_public_key_string = open(os.path.join(os.path.dirname(os.path.abspath(__file__)),"keys/alipay_public_key.pem")).read()


# 买家账号hxexbl3145@sandbox.com

class PaymentStatusView(View):
    """保存订单支付结果"""

    def get(self, request):

        # 接收参数: 接收所有的查询字符串参数
        query_dict_parm = request.GET

        # 剔除并接收查询字符串参数sign
        # 转字典的目的: 因为request.GET返回的类型是QueryDict,不是python字典,没有pop方法,为了能调用pop,所以转字典
        data = query_dict_parm.dict()
        signature = data.pop("sign")

        # 创建支付宝SDK对象
        alipay = AliPay(
            appid=settings.ALIPAY_APPID,  # 应用ID
            app_notify_url=None,  # 默认回调url,我们用的时同步,所以传入None
            app_private_key_string=app_private_key_string,  # 应用私钥
            alipay_public_key_string=alipay_public_key_string,  # 支付宝公钥
            sign_type="RSA2",  # 秘钥签名的算法标准
            debug=settings.ALIPAY_DEBUG
        )

        # 使用支付宝SDK对象调用验证回调的接口方法
        success = alipay.verify(data,signature)

        # 如果验证通过
        if success:
            # 保存支付宝的订单编号和美多商城的订单编号
            out_trade_no = data.get("out_trade_no") # 美多商城订单号
            trade_no = data.get("trade_no") #　支付宝订单号
            Payment.objects.create(
                order_id = out_trade_no, # 美多商城订单号
                trade_id = trade_no, #　支付宝订单号
            )

            # 修改订单状态: 由待支付修改为待评价
            OrderInfo.objects.filter(order_id=out_trade_no, status=OrderInfo.ORDER_STATUS_ENUM['UNPAID']).update(
                status=OrderInfo.ORDER_STATUS_ENUM["UNCOMMENT"])

            # 响应支付成功的页面
            context = {
                "trade_id":trade_no
            }
            return render(request,"pay_success.html",context)
        # 如果验证失败,响应非法请求
        else:
            return http.HttpResponseBadRequest("非法请求")


class PaymentView(LoginRequiredJSONMixin,View):
    """支付宝支付"""

    def get(self,request,order_id):
        """
        对接支付宝的支付功能
        :param request:
        :param order_id: 要支付的订单号
        :return: JSON
        """

        # 获取登录用户
        user = request.user

        # 获取订单并校验订单: 查询当前订单是否是当前登陆用户的,并且订单的状态要是待支付
        try:
            order = OrderInfo.objects.get(order_id=order_id,user=user,status=OrderInfo.ORDER_STATUS_ENUM["UNPAID"])
        except OrderInfo.DoesNotExist:
            return http.HttpResponseForbidden("参数order_id错误")

        # 初始化支付宝SDK对象
        alipay = AliPay(
            appid=settings.ALIPAY_APPID, # 应用ID
            app_notify_url=None,  # 默认回调url,我们用的时同步,所以传入None
            app_private_key_string = app_private_key_string, # 应用私钥
            alipay_public_key_string = alipay_public_key_string, # 支付宝公钥
            sign_type="RSA2", # 秘钥签名的算法标准
            debug=settings.ALIPAY_DEBUG
        )

        # 调用SDK提供的接口方法,获取到收银台页面的链接
        order_string = alipay.api_alipay_trade_page_pay(
            out_trade_no=order_id, # 美多商城维护的订单号
            total_amount=str(order.total_amount), #支付款
            subject="美多商城%s" % order_id, # 支付订单的标题
            return_url=settings.ALIPAY_RETURN_URL # 支付完之后的回调地址
        )

        # 使用网管拼接order_string获取到收银台页面链接
        # 电脑网站支付，正式环境，需要跳转到https://openapi.alipay.com/gateway.do? + order_string
        # 电脑网站支付，开发环境，需要跳转到https://openapi.alipaydev.com/gateway.do? + order_string
        alipay_url = settings.ALIPAY_URL + "?" + order_string


        # 返回结果
        return http.JsonResponse({"code":RETCODE.OK,"errmsg":"OK","alipay_url":alipay_url})
